package rbac.view;

import rbac.domain.dto.DeptDto;
import rbac.domain.vo.DeptVo;
import rbac.domain.vo.Result;
import rbac.service.IDeptService;
import rbac.service.collection.DeptService;
import rbac.service.array.UserService;
import rbac.util.DateTimeUtils;
import rbac.util.SingletonFactory;

/**
 * 部⻔管理界⾯
 */

public class DeptView extends BaseView<DeptVo, IDeptService>{

    private DeptView() {
        service = SingletonFactory.getInstance(DeptService.class);
    }

    public static final String MENU= """
                
                ---------------------
                       部门管理
                ---------------------
                |     0...返回上级    |
                |     1...部⻔列表    |
                |     2...创建部门    |
                |     3...删除部门    |
                ---------------------
                请输⼊选项：""";


    public void show() {
        String menuChoice; // ⽤于存储⽤户输⼊的选项
        do {
            System.out.print(MENU);
            menuChoice = MainView.input.nextLine();
            switch (menuChoice) {
                case "0" -> System.out.println("已返回上⼀级菜单");
                case "1" -> list();
                case "2" -> create();
                case "3" -> update();
                case "4" -> delete();
                default -> System.out.println("输⼊⾮法，请输⼊正确的菜单编号！"); }
        } while (!"0".equals(menuChoice));
    }

    public void list(){
        Result result = service.list(); //调⽤服务层获取所有部⻔数据

        cache = (DeptVo[]) result.data; // 将获取到的部⻔数据存⼊缓存

        System.out.println("ID\t 部⻔名称\t 部⻔电话\t 更新时间");
        for(DeptVo dept : cache) {
            if (dept != null) {
                System.out.printf("%d\t%s\t%s\t%s\n",
                        dept.id, dept.name, dept.phone, DateTimeUtils.format(dept.updateAt));
            }
        }
    }

    public void create(){
        System.out.print(" 请输⼊部⻔名称：");
        String name = MainView.input.nextLine(); // 获取⽤户输⼊的部⻔名称

        System.out.print(" 请输⼊部⻔电话： ");
        String phone = MainView.input.nextLine();

        DeptDto dto = new DeptDto(name, phone);

        Result result = service.create(dto); // 调⽤服务层的创建⽅法，创建新的部⻔

        if (!result.success){
            printError(result.message);
            return;
        } // 如果创建操作失败，输出错误信息

        System.out.println(result.message); // 创建成功，输出成功信息

        list();
    }

    public void update(){
        DeptVo dept = getCacheById();
        if (dept == null){
            return;
        }

        // 提示⽤户输⼊新的部⻔名称
        System.out.print("请输⼊部⻔名称，直接按回⻋表示不修改：");
        String name = MainView.input.nextLine();
        // 如果⽤户没有输⼊新名称，保持原名称
        name = "".equals(name) ? dept.name : name;

        // 提示⽤户输⼊新的部⻔电话
        System.out.print("请输⼊部⻔电话，直接按回⻋表示不修改：");
        String phone = MainView.input.nextLine();
        // 如果⽤户没有输⼊新电话，保持原电话
        phone = "".equals(phone) ? dept.phone : phone;

        DeptDto dto = new DeptDto(name, phone); // 创建新的 DeptDto对象，⽤于更新部⻔信息

        Result result = service.update(dto, dept.id); // 调⽤服务层更新部⻔信息

        // 如果更新失败，显示错误信息
        if (!result.success) {
            printError(result.message);
            return;
        }

        System.out.println(result.message);

        list();
    }

    public void delete(){
        DeptVo dept = getCacheById();
        if (dept == null){
            return;
        }

        // 提示⽤户确认是否删除
        System.out.print("输⼊'Y'确认删除，输⼊其它取消删除：");
        String confirm = MainView.input.nextLine();

        //如果⽤户输⼊的不是'Y'或'y'，则取消删除
        if (!"Y".equalsIgnoreCase(confirm)) {
            System.out.println("您已取消删除");
            return;
        }

        // 调⽤服务层进⾏删除操作
        Result result = service.delete(dept.id);

        //如果删除操作失败，提示错误信息
        if (!result.success) {
            printError(result.message);
            return;
        }

        //删除成功，输出成功信息并列出当前部⻔列表
        System.out.println(result.message);

        list();
    }

}
